<?php

namespace app\socket\controller;
/**
 * 用于检测业务代码死循环或者长时间阻塞等问题
 * 如果发现业务卡死，可以将下面declare打开（去掉//注释），并执行php start.php reload
 * 然后观察一段时间workerman.log看是否有process_timeout异常
 */

declare (ticks = 1);

use \GatewayWorker\Lib\Gateway;
use think\Cache;

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     *
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        // 向当前client_id发送数据
        $arr = ['type' => 'client_id', 'client_id' => $client_id];
        Gateway::sendToClient($client_id, json_encode($arr));
        echo $client_id;
        // Cache::set($client_id, '11');
    }

    /**
     * 当客户端发来消息时触发
     * @param int $client_id 连接id
     * @param mixed $message 具体消息
     */
    public static function onMessage($client_id, $message)
    {
        $arr = json_decode($message, true);
    //    echo $message;
        //心跳检测的回复机制
        if ($arr['type'] == 'ping') {
            return Gateway::sendToClient($client_id, json_encode(['type' => 'pong']));
        }
        //当设备发来注册请求
        if ($arr['type'] == 'register') {
            $mac = $arr['mac'];
            //具体的注册方法
            $res = ['type' => 'state', 'state' => '1'];
            return Gateway::sendToClient($client_id, json_encode($res));
        }
        return Gateway::sendToClient($client_id, json_encode(['type' => 'error']));
    }

    /**
     * 当用户断开连接时触发
     * @param int $client_id 连接id
     */
    public static function onClose($client_id)
    {
        // 向所有人发送
        $arr = ['type' => 'error', 'error' => '设备断开连接'];
        Gateway::sendToClient($client_id, json_encode($arr));
    }
}
